﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Transactions;

namespace MillerApp.CommonLib.DataAccess
{
    /// <summary>
    /// 对System.Transactions.TransactionScope进行封装，改变了无参数的构造函数中默认的隔离级别，新的默认的隔离级别为ReadCommitted,TransactionScopeOption为Required
    /// </summary>
    public class DBTransactionScope : IDisposable
    {
        TransactionScope ts;

        /// <summary>
        /// 初始化 TransactionScope 类的新实例
        /// TransactionScopeOption为：Required
        /// System.Transactions.IsolationLevel为：ReadCommitted
        /// </summary>
        public DBTransactionScope()
        {
            TransactionOptions tsOption = new TransactionOptions();
            tsOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            ts = new TransactionScope(TransactionScopeOption.Required, tsOption);
        }

        /// <summary>
        /// 初始化 TransactionScope 类的新实例，并将指定的事务设置为环境事务，以便该范围中进行的事务性工作使用此事务。 
        /// </summary>
        /// <param name="transactionToUse">要设置为环境事务（以便该范围中进行的事务性工作使用此事务）的事务。</param>
        public DBTransactionScope(Transaction transactionToUse)
        {
            ts = new TransactionScope(transactionToUse);
        }

        /// <summary>
        /// 以指定的要求初始化 TransactionScope 类的新实例。
        /// </summary>
        /// <param name="scopeOption">枚举的一个实例，描述与此事务范围关联的事务要求。</param>
        public DBTransactionScope(TransactionScopeOption scopeOption)
        {

            ts = new TransactionScope(scopeOption);
        }

        /// <summary>
        /// 使用指定的超时时间值初始化 TransactionScope 类的新实例，并将指定的事务设置为环境事务，以便该范围中进行的事务性工作使用此事务。
        /// </summary>
        /// <param name="transactionToUse">要设置为环境事务（以便该范围中进行的事务性工作使用此事务）的事务。</param>
        /// <param name="scopeTimeOut">TimeSpan，在它之后，事务范围将超时并中止此事务。</param>
        public DBTransactionScope(Transaction transactionToUse, TimeSpan scopeTimeOut)
        {
            ts = new TransactionScope(transactionToUse, scopeTimeOut);
        }

        /// <summary>
        ///以指定的超时时间值和要求初始化 TransactionScope 类的新实例。 
        /// </summary>
        /// <param name="scopeOption">枚举的一个实例，描述与此事务范围关联的事务要求。</param>
        /// <param name="scopeTimeOut">TimeSpan，在它之后，事务范围将超时并中止此事务。</param>
        public DBTransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeOut)
        {
            ts = new TransactionScope(scopeOption, scopeTimeOut);
        }

        /// <summary>
        /// 以指定的要求初始化 TransactionScope 类的新实例。 
        /// </summary>
        /// <param name="scopeOption">枚举的一个实例，描述与此事务范围关联的事务要求。</param>
        /// <param name="transactionOptions">一个 TransactionOptions 结构，描述要在创建新事务时使用的事务选项。如果使用现有的事务，则此参数中的超时值将应用于该事务范围。如果该时间在范围被释放之前到期，则事务将中止。</param>
        public DBTransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions)
        {
            ts = new TransactionScope(scopeOption, transactionOptions);
        }


        /// <summary>
        /// 使用指定的超时时间值和 COM+ 互操作性要求初始化 TransactionScope 类的新实例，并将指定的事务设置为环境事务，以便该范围中进行的事务性工作使用此事务。
        /// </summary>
        /// <param name="transactionToUse">要设置为环境事务（以便该范围中进行的事务性工作使用此事务）的事务。</param>
        /// <param name="scopeTimeOut">TimeSpan，在它之后，事务范围将超时并中止此事务。</param>
        /// <param name="interopOption">EnterpriseServicesInteropOption 枚举的一个实例，用于说明关联的事务如何与 COM+ 事务进行交互。</param>
        public DBTransactionScope(Transaction transactionToUse, TimeSpan scopeTimeOut, EnterpriseServicesInteropOption interopOption)
        {
            ts = new TransactionScope(transactionToUse, scopeTimeOut, interopOption);
        }

        /// <summary>
        /// 使用指定的范围和 COM+ 互操作性要求以及事务选项初始化 TransactionScope 类的新实例。 
        /// </summary>
        /// <param name="scopeOption">枚举的一个实例，描述与此事务范围关联的事务要求。</param>
        /// <param name="transactionOptions">一个 TransactionOptions 结构，描述要在创建新事务时使用的事务选项。如果使用现有的事务，则此参数中的超时值将应用于该事务范围。如果该时间在范围被释放之前到期，则事务将中止。</param>
        /// <param name="interopOption">EnterpriseServicesInteropOption 枚举的一个实例，用于说明关联的事务如何与 COM+ 事务进行交互。</param>
        public DBTransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption)
        {
            ts = new TransactionScope(scopeOption, transactionOptions, interopOption);
        }

        /// <summary>
        /// 指示范围中的所有操作都已成功完成。
        /// </summary>
        public void Complete()
        {
            ts.Complete();
        }



        #region IDisposable 成员

        /// <summary>
        /// 结束事务范围。
        /// </summary>
        public void Dispose()
        {
            ts.Dispose();
        }

        #endregion


    }
}
